"""
定義接口測試用例
使用 unittest
1.導包
2.構造測試數據
3.創建測試類
    3.1前置方法
    3.2後置方法
    3.3測試方法(參數化)
"""

# 導包
import json
import requests
import unittest
import app
from api.login import LoginAPI
from parameterized import parameterized

# 構造測試數據
def build_data():
    # 產生一個空列表,用來儲存json數據文件
    test_data = []
    # 定義要讀入的json數據文件路徑
    file = app.BASE_DIR +"/data/login.json"
    # 打開文件流f來讀取json數據文件內容,並將其存入test_data列表中
    with open(file, encoding="utf-8") as f:
        # 把文件f的內容以json格式load進入json_data列表中
        json_data = json.load(f)
        # 遍歷json_data列表中的每一個element case_data,
        # 取出每一個參數,並將每組測試參數附加入(append)test_data列表中
        for case_data in json_data:
            login_data = case_data.get("login_data")
            status_code = case_data.get("status_code")
            success = case_data.get("success")
            code = case_data.get("code")
            message = case_data.get("message")
            # 以元祖(tuple)的形式將每一組測試資料元件附加入(append)test_da列表中表中
            test_data.append((login_data, status_code, success, code, message))
        # 以(login_data, status_code, success, code, message)形式打印test_data列表
        print("test_data = {}".format((login_data, status_code, success, code, message)))
    # 最後回傳test_data列表
    return test_data

# 創建測試類 要繼承unittest.TestCase
class TestLogin(unittest.TestCase):
    # 前置方法
    def setUp(self):
        # 實例化接口類對象 login_api 代表get或post的response
        self.login_api = LoginAPI()
        # 創建session對象 session
        self.session = requests.Session()
    # 後置方法
    def tearDown(self):
        # 關閉session對象
        if self.session:
            self.session.close()

    # 測試方法
    # 1.登陸成功
    # 引用參數化數據
    # 調用方法時是利用修飾器@parameterized.expand(build_data())來調用由build_data()所建立的json測試資料文件
    @parameterized.expand(build_data())
    def test01_case001(self, login_data, status_code, success, code, message):
        # 调用登录接口进行登录
        response = self.login_api.login(login_data)
        print(response.json())
        # 断言
        self.assertEqual(status_code, response.status_code)
        self.assertEqual(success, response.json().get("success"))
        self.assertEqual(code, response.json().get("code"))
        self.assertIn(message, response.json().get("message"))
